/*
Copyright (C) 2009  Raymond Jeon
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/






#include "gl_lib_include.h"
#include "gl_mail_log.h"
#include "gl_mail_define.h"
#include "gl_mail_gdata.h"
#include "gl_pop3_session.h"
#include "gl_pop3_command.h"
#include "gl_mail_statistics.h"






////////////////////////////////////////////////////////////////////////////////
//	Date : 2003-2-20
//	Update : 
//	Author : Raymond Jeon
//	Parameters
//	Return Value  
//	Remarks 
////////////////////////////////////////////////////////////////////////////////

BOOL GlPop3ThreadMain(glqueue_ *qData)
{
	glpop3session_	pop3_;
	glpop3session_	*gsn = &(pop3_);
	SOCKRET			sockRet;


	GlLogPop3(1, "POP3 Session Start (%s)", qData->q_szIp);	
	GlStatEventAdd(STAT_POP3CONN, 1);
	GLTRACE("EventAdd(%s)", qData->q_szIp);


	if (GlPop3SessionInit(gsn, qData) == FALSE)
	{
		GLTRACE("GlPop3SessionInit error(%s)", qData->q_szIp);
		GlPop3SessionFree(gsn);
		return FALSE;
	}

	if (GlLinkListFindWildCardTild(glData.listenPop3.llRejectIP, qData->q_szIp) &&
		!GlLinkListFindWildCardTild(glData.listenPop3.llAllowIP, qData->q_szIp))
	{
		GlStatEventAdd(STAT_REJECTPOP3, 1);
		GlSocketStreamPrintfLnLog(gsn->stream, GlLogPop3, "-ERR Reject IP (%s)", qData->q_szIp);
		GlPop3SessionFree(gsn);
		return TRUE;
	}

	GlSocketStreamPrintfLn(gsn->stream, "+OK %s POP3 server (%s) is ready %s",
				__SZ(glData.szServerName), glData.szServerVersion, gsn->szDate);

    while (gsn->stream->bClose == FALSE)
	{
		sockRet = GlSocketStreamReadLineLog4PassHide(gsn->stream, GlLogPop3);
		if (sockRet <= 0)
		{
			GlLogPop3(1, "Socket error");
			break;
		}
		
		GlPop3CommandFuncCall(gsn);
	}

	GlPop3SessionFree(gsn);

	return TRUE;
}
